package pruebas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import juego.Energia;
import junit.framework.TestCase;


public class TestEnergia extends TestCase{
	
	public void testRecibirDanioLineal() {
		
		Energia energia = new Energia (10);
		assertEquals (10, energia.verEnergia());
		
		energia.reducirEnergia(3);
		assertEquals (7, energia.verEnergia());
	};
	
	public void testReducirMitad() {
		
		Energia energia = new Energia (10);
		assertEquals (10, energia.verEnergia());
		
		energia.reducirMitad();
		assertEquals (5, energia.verEnergia());
		
		energia.reducirMitad();
		assertEquals (3, energia.verEnergia());
	};
	
	public void testQuedaEnergia() {
		
		Energia energia = new Energia (10);
		energia.reducirEnergia(3);
		assertTrue (energia.quedaEnergia());
		
		energia.reducirEnergia(7);
		assertFalse (energia.quedaEnergia());
		
		energia.reducirEnergia(7);
		assertFalse (energia.quedaEnergia());
	};
	
	public void testRecargarEnergia() {
		
		Energia energia = new Energia (10);
		energia.reducirEnergia(7);
		energia.incrementarEnergia(5);
		assertEquals (8,energia.verEnergia());
		
		energia.incrementarEnergia(5);
		assertEquals (10,energia.verEnergia());
	};
	

	private static void persistir(String archivo, Energia cronometro) {
		
		try {

			Document doc = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder().newDocument();

			Element element = cronometro.getElement(doc);
			doc.appendChild(element);

			Transformer transformer = TransformerFactory.newInstance()
					.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.transform(new DOMSource(doc), new StreamResult(
					new PrintStream(archivo)));

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerFactoryConfigurationError e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}
	
	private static Energia recuperar(String archivo) {
		try {
			
			Document doc = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder().parse(new File(archivo));
			Element element = doc.getDocumentElement();

			Energia energia = Energia.fromElement(element);
			return energia;
			
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public void testPersistencia() {

		String archivo = "energia_java.xml";
		Energia energiaOriginal = new Energia(30);
		energiaOriginal.reducirMitad();
		persistir(archivo, energiaOriginal);
		Energia energiaRecuperada = recuperar(archivo);
		assertEquals(15,energiaRecuperada.verEnergia());
		energiaRecuperada.reducirEnergia(3);
		assertEquals(12,energiaRecuperada.verEnergia());
		energiaRecuperada.incrementarEnergia(50);
		assertEquals(30,energiaRecuperada.verEnergia());
	}


}
